home *** CD-ROM | disk | FTP | other *** search
/ Network PC / Network PC.iso / amiga utilities / disk utilities / backup / backup_restore / backup_src_v3.20.lha / Statistics.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-08-20  |  7.3 KB  |  318 lines

  1. // Statistics.c
  2. // 19 Aug 1996 20:31:27
  3.  
  4. #ifndef    BACKUP_INCLUDE
  5. #include "IncludeAll.c"
  6. #endif
  7. #include "Backup.h"
  8. #include "Statistics.h"
  9. #include "Backup_Proto.h"
  10. #include "BackupStrings.h"
  11.  
  12.  
  13. #define GW    70    // Gadget-Breite
  14. #define    GH    15    // Gadget-Höhe
  15. #define    BGCOLOR    0
  16. #define    FGCOLOR    1
  17.  
  18.  
  19. static UWORD ComputeX( UWORD value );
  20. static UWORD ComputeY( UWORD value );
  21. static int StatWindowIDCMPHandler(void);
  22. static void __interrupt HandleStatWindowGadgetCallback(struct Hook *hook, struct Gadget *Gad, ULONG *Code);
  23. static void HandleStatGadgetHelp(const struct Gadget *gad, USHORT code);
  24.  
  25.  
  26. // aus Backup.c
  27. extern struct Window *aktWindow;
  28. extern unsigned char disknr;        // laufende Nummer der Diskette
  29. extern struct TextFont *ScreenFont;
  30.  
  31. // aus FileSelect.c
  32. extern struct Window *activeWindow;    // das gerade aktive Backup-Window
  33.  
  34. // aus Backup_Window.c
  35. extern struct Screen *WBScreen;
  36.  
  37.  
  38. static char TextFilesSaved[45];
  39. static char TextTotalBytes[45];
  40. static char TextBackupDuration[45];
  41. static char TextDataRate[45];
  42. static char TextDataRate2[45];
  43.  
  44.  
  45. static ULONG StatWindowGadgetTags[] =
  46.     {
  47.     (GTTX_Text), (ULONG) TextFilesSaved,
  48.         GTTX_Justification, GTJ_CENTER,
  49.         GTTX_Clipped, TRUE,
  50.     (TAG_END),
  51.         (GTTX_Text), (ULONG) TextTotalBytes,
  52.         GTTX_Justification, GTJ_CENTER,
  53.         GTTX_Clipped, TRUE,
  54.     (TAG_END),
  55.         (GTTX_Text), (ULONG) TextBackupDuration,
  56.         GTTX_Justification, GTJ_CENTER,
  57.         GTTX_Clipped, TRUE,
  58.     (TAG_END),
  59.         (GTTX_Text), (ULONG) TextDataRate,
  60.         GTTX_Justification, GTJ_CENTER,
  61.         GTTX_Clipped, TRUE,
  62.     (TAG_END),
  63.         (GTTX_Text), (ULONG) TextDataRate2,
  64.         GTTX_Justification, GTJ_CENTER,
  65.         GTTX_Clipped, TRUE,
  66.     (TAG_END),
  67.         (GT_Underscore), '_',
  68.     (TAG_DONE)
  69.     };
  70.  
  71. static UWORD StatWindowGadgetTypes[] =
  72.     {
  73.     TEXT_KIND,
  74.     TEXT_KIND,
  75.     TEXT_KIND,
  76.     TEXT_KIND,
  77.     TEXT_KIND,
  78.     BUTTON_KIND,
  79.     };
  80.  
  81. static struct NewGadget StatWindowNGad[] =
  82.     {
  83.       9,   4, 325, 15,                NULL, NULL, StatWindowLine1, 1, NULL, NULL,
  84.       9,  23, 325, 15,                NULL, NULL, StatWindowLine2, 1, NULL, NULL,
  85.       9,  42, 325, 15,                NULL, NULL, StatWindowLine3, 1, NULL, NULL,
  86.       9,  61, 325, 15,                NULL, NULL, StatWindowLine4, 1, NULL, NULL,
  87.       9,  80, 325, 15,                NULL, NULL, StatWindowLine5, 1, NULL, NULL,
  88.     137, 105,  75, 19, (STRPTR) MSG_OK_GAD, NULL, StatWindowOkButton, 16, NULL,  NULL,
  89.     };
  90.  
  91. static struct Hook StatWindowGadgetShortHook =
  92.     {
  93.     { NULL },
  94.     HookEntry,
  95.     (ULONG (*)()) HandleStatWindowGadgetCallback,
  96.     NULL,        // wird (struct BackupOptions *)
  97.     };
  98.  
  99. static struct Gadget *StatWindowGList = NULL;
  100. static struct Gadget *StatWindowGadgets[STATWINDOW_NGAD];
  101.  
  102. static struct GadgetShort *StatWindowGadgetShort;    // Tabelle für Tasten-Kürzel
  103.  
  104. static MINLIST(StatResourceList);
  105.  
  106. static struct Window *StatWindow;
  107.  
  108. static ULONG FontX, FontY;
  109. static UWORD OffX, OffY;
  110.  
  111. static struct BInputHandler *StatInput = NULL;
  112.  
  113.  
  114. static UWORD ComputeX( UWORD value )
  115. {
  116.     return ((UWORD) ((value * FontX) / 65535));
  117. }
  118.  
  119.  
  120. static UWORD ComputeY( UWORD value )
  121. {
  122.     return ((UWORD) ((value * FontY) / 65535));
  123. }
  124.  
  125.  
  126. void CleanupStat(void)
  127. {
  128.     RemBInputHandler(&StatInput);
  129.  
  130.     if (StatWindow)
  131.         {
  132.         if (aktWindow)
  133.             WindowBusy(aktWindow, FALSE);
  134.  
  135.         SafeCloseWindow(&StatWindow);
  136.         }
  137.  
  138.     if (StatWindowGList)
  139.         {
  140.         FreeGadgets(StatWindowGList);
  141.         StatWindowGList = NULL;
  142.         }
  143.     FreeBResources(&StatResourceList);
  144.     DestroyGadgetShort(&StatWindowGadgetShort);
  145. }
  146.  
  147.  
  148. void printstat(long FileZahl, long ByteZahl, long startzeit, long endzeit, BOOL toTape)
  149. {
  150.     char TempText[45];
  151.     const char *DiskName;
  152.     struct NewWindow NewStatWindow;
  153.     struct Gadget *g;
  154.     long zeitdiff;
  155.     long datenrate;
  156.  
  157.     ASSERT_VALID(aktWindow);
  158.  
  159.     zeitdiff = (endzeit - startzeit)/100L;
  160.     if (zeitdiff < 0L)
  161.         zeitdiff += 24L*60L*60L;
  162.  
  163.     datenrate = zeitdiff != 0 ? ((ByteZahl/zeitdiff)*100L)/1024L : 0;
  164.  
  165.     if (toTape)
  166.         DiskName = GetString(disknr > 1 ? MSG_TAPE2 : MSG_TAPE1);
  167.     else
  168.         DiskName = GetString(disknr > 1 ? MSG_DISK2 : MSG_DISK1);
  169.  
  170.     KMBytes(TempText, ByteZahl);
  171.  
  172.     myFormatString(TextFilesSaved, GetString(MSG_N_FILESSAVED), FileZahl, (long) disknr, DiskName);
  173.     sprintf(TextTotalBytes, GetString(MSG_TOTAL_BYTES), TempText);
  174.     sprintf(TextBackupDuration, GetString(MSG_BACKUP_DURATION), zeitdiff/60, zeitdiff % 60);
  175.     sprintf(TextDataRate, GetString(MSG_DATA_RATE), datenrate/100, (datenrate % 100)/10);
  176.  
  177.     datenrate = (60*datenrate)/1000L;
  178.     sprintf(TextDataRate2, GetString(MSG_DATA_RATE2),  datenrate/100, datenrate % 100);
  179.  
  180.     CalcGadgetScale(WBScreen, ScreenFont, &FontX, &FontY, &OffX, &OffY, 8, 11);
  181.  
  182.     CreateGadgetShort(&StatWindowGadgetShort);
  183.  
  184.     g = CreateGadgetList(&StatWindowGList, STATWINDOW_NGAD,
  185.             WBScreen->Font,
  186.             StatWindowGadgetTypes,
  187.             StatWindowNGad,
  188.             StatWindowGadgets,
  189.             StatWindowGadgetTags,
  190.             StatWindowGadgetShort,
  191.             &StatResourceList,
  192.             FontX, FontY,
  193.             OffX, OffY
  194.             );
  195.  
  196.     if (NULL == g)
  197.         {
  198.         alarm(GetString(MSG_CREATEGAD_FAILED), __FUNC__);
  199.         return;
  200.         }
  201.  
  202.     WindowBusy(aktWindow, TRUE);
  203.  
  204.     NewStatWindow.Width = ComputeX(341) + WBScreen->WBorLeft + WBScreen->WBorRight;
  205.     NewStatWindow.Height = ComputeY(135) + WBScreen->WBorBottom + WBScreen->BarHeight;
  206.  
  207.     CenterWindow(aktWindow, &NewStatWindow);
  208.  
  209.     StatWindow = OpenWindowTags(NULL,
  210.             WA_Left, NewStatWindow.LeftEdge,
  211.             WA_Top, NewStatWindow.TopEdge,
  212.             WA_Width, NewStatWindow.Width,
  213.             WA_Height, NewStatWindow.Height,
  214.             WA_AutoAdjust, TRUE,
  215.             WA_Flags, WFLG_SMART_REFRESH | WFLG_NOCAREREFRESH
  216.                 | WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_ACTIVATE,
  217.             WA_IDCMP, IDCMP_GADGETUP | IDCMP_RAWKEY | IDCMP_VANILLAKEY | BUTTONIDCMP,
  218.             WA_Title, GetString(MSG_STATWINDOW_TITLE),
  219.             WA_PubScreen, aktWindow->WScreen,
  220.             WA_NewLookMenus, TRUE,
  221.             WA_Gadgets, StatWindowGList,
  222.             TAG_END);
  223.  
  224.     if (NULL == StatWindow)
  225.         {
  226.         alarm(GetString(MSG_CANNOT_OPEN_WINDOW), __FUNC__, "StatWindow");
  227.         return;
  228.         }
  229.  
  230.     GT_RefreshWindow(StatWindow, NULL );
  231.  
  232.     StatInput = AddBInputHandler(1 << StatWindow->UserPort->mp_SigBit, StatWindowIDCMPHandler);
  233.  
  234.     do    {
  235.         eingabe(0l);
  236.         } while (StatWindow);
  237.  
  238.     CleanupStat();
  239. }
  240.  
  241.  
  242. static int StatWindowIDCMPHandler(void)
  243. {
  244.     struct IntuiMessage *msg;
  245.     int Result = 0;
  246.  
  247.     while (StatWindow && (msg = GT_GetIMsg(StatWindow->UserPort)) )
  248.         {
  249.         ULONG class;
  250.         USHORT code;
  251.         APTR Address;
  252.  
  253.         class = msg->Class;
  254.         code = msg->Code;
  255.         Address = msg->IAddress;
  256.  
  257.         GT_ReplyIMsg(msg);
  258.  
  259.         switch (class)
  260.             {
  261.         case IDCMP_GADGETHELP:
  262.             if (NULL == Address)
  263.                 {
  264.                 // Nicht über unserem Window
  265.                 }
  266.             else if (Address == (APTR) StatWindow)
  267.                 {
  268.                 // über unserem Window
  269.                 CallHelp(HELPID_STATWINDOW, TRUE);    // im StatWindow
  270.                 }
  271.             else
  272.                 HandleStatGadgetHelp((struct Gadget *) Address, code);
  273.             break;
  274.  
  275.         case IDCMP_MENUHELP:
  276.             break;
  277.  
  278.         case IDCMP_GADGETUP:
  279.             Result = ((struct Gadget *) Address)->GadgetID;
  280.             SafeCloseWindow(&StatWindow);
  281.             break;
  282.  
  283.         case IDCMP_MENUPICK:
  284.             break;
  285.  
  286.         case IDCMP_VANILLAKEY:
  287.             Result = HandleGadgetShort(StatWindowGadgetShort, StatWindow, code, &StatWindowGadgetShortHook);
  288.             break;
  289.  
  290.         case IDCMP_RAWKEY:
  291.             if (GADCODE_HELP == code)
  292.                 ToggleHelp();
  293.             break;
  294.  
  295.         case IDCMP_REFRESHWINDOW:
  296.             // This handling is REQUIRED with GadTools.
  297.             GT_BeginRefresh(StatWindow);
  298.             GT_EndRefresh(StatWindow, TRUE);
  299.             break;
  300.             }
  301.         }
  302.     return Result;
  303. }
  304.  
  305.  
  306. static void __interrupt HandleStatWindowGadgetCallback(struct Hook *hook, struct Gadget *Gad, ULONG *Code)
  307. {
  308.     SafeCloseWindow(&StatWindow);
  309. }
  310.  
  311.  
  312. static void HandleStatGadgetHelp(const struct Gadget *gad, USHORT code)
  313. {
  314.     ASSERT_VALID(gad);
  315.     if (!(gad->GadgetType & GTYP_SYSGADGET))
  316.         CallHelp(gad->GadgetID, TRUE);
  317. }
  318.